
/*
 * Ednei Leite da Silva
 * R.G.M.: 019250
 * 
 * Compilação:
 * gcc -o user user.c -lsqlite3 -lcrypt -Wall -pedantic
 */
#include "bibliotecas.h"

/*
 * Função que realiza a execução das query de inserção e alteração
 */
int execute_sql(const char *sql);

int main(int argc, char **argv) {
    char *sql, *usuario, *senha;
    char opc;

    usuario = (char*) malloc(sizeof (char) * 50);
    senha = (char*) malloc(sizeof (char) * 50);
    sql = (char*) malloc(sizeof (char) * 250);

    printf("O que você deseja fazer?\n"
            "\t 1 - Adicionar usuário admin\n"
            "\t 2 - Alterar senha\n"
    );

    scanf("%c", &opc);

    /* se opc == 1 realiza a inserção de um novo usuário */
    if (opc == '1') {
        printf("\t\tNovo usuário:\n");
        printf("Usuario: ");
        scanf("%s", usuario);
        senha = getpass("Senha: ");

        /* Query de criação de um novo usuário */
        sprintf(sql, "INSERT INTO acesso VALUES(NULL, \"%s\", \"%s\")", usuario, crypt(senha, SALT));

        /* Informa o resultado da operação */
        if (execute_sql(sql)) {
            printf("Usuário inserido com sucesso\n");
        }

        /* Ocorre quando tenta criar um novo usuário */
        else {
            printf("Erro ao inserir usuário\n");
        }
    }

    /* realiza a alteração do usuário */
    else if (opc == '2') {
        printf("\t\tAlteração de senha:\n");
        printf("Usuario: ");
        scanf("%s", usuario);
        senha = getpass("Nova Senha: ");

        /* Query de alteração de senha */
        sprintf(sql, "UPDATE acesso SET senha = '%s' WHERE usuario = '%s'", crypt(senha, SALT), usuario);

        senha = getpass("SENHA ANTERIOR:");

        sprintf(sql, "%s AND senha = '%s'", sql, crypt(senha, SALT));

        if (execute_sql(sql)) {
            printf("Senha alterada com sucesso\n");
        } else {
            printf("Erro ao alterar senha\n");
        }
    }

    /* libera memória utilizada  */
    free(sql);
    free(usuario);
    free(senha);

    return 0;
}

/* Função que executa a inserção e alteração de senha */
int execute_sql(const char* sql) {
    sqlite3 *db;
    sqlite3_stmt *statement;
    int flag = 1;

    /* abre conexão com o banco de dados */
    if (sqlite3_open(FILE_BD, &db) != SQLITE_OK) {
        printf("Erro ao abrir banco de dados. Verreturnifique se o banco de dados e a tabela acesso existem");
        flag = 0;
    }

    /* cria instancia com banco de dados */
    else if (sqlite3_prepare_v2(db, sql, -1, &statement, 0) != SQLITE_OK) {
        flag = 0;
    }

    /* executa instancia criada */
    else if (sqlite3_step(statement) != SQLITE_DONE) {
        flag = 0;
    }

    /* fecha conexão com o banco de dados */
    sqlite3_close(db);

    return flag;
}

